#ifndef _CCHARTSERIES_H_
#define _CCHARTSERIES_H_

#include <buola/chart.h>

#include <buola/image/ccolor.h>
#include <buola/mat/cmat.h>

namespace buola { namespace chart {

class CSeries : public UShared
{
public:
    template<typename tArray>
    CSeries(const tArray &pArray,int pLength)
    {
        mXData.Resize(pLength);
        mYData.Resize(pLength);
        
        for(int i=0;i<pLength;i++)
        {
            mXData[i]=i;
            mYData[i]=pArray[i];
        }
        
        CalcSeries();
    }
    
    template<typename tArray>
    CSeries(const tArray &pArray)
    {
        int lLength=pArray.size();
    
        mXData.Resize(lLength);
        mYData.Resize(lLength);
        
        for(int i=0;i<lLength;i++)
        {
            mXData[i]=i;
            mYData[i]=pArray[i];
        }
        
        CalcSeries();
    }
    
    template<typename tScalar>
    CSeries(const std::vector<CPoint<tScalar>> &pArray)
    {
        int lLength=pArray.size();
    
        mXData.Resize(lLength);
        mYData.Resize(lLength);
        
        for(int i=0;i<lLength;i++)
        {
            mXData[i]=pArray[i].x;
            mYData[i]=pArray[i].y;
        }
        
        CalcSeries();
    }
    
    template<typename tXArray,typename tYArray>
    CSeries(const tXArray &pXArray,const tYArray &pYArray,int pLength)
    {
        mXData.Resize(pLength);
        mYData.Resize(pLength);
        
        for(int i=0;i<pLength;i++)
        {
            mXData[i]=pXArray[i];
            mYData[i]=pYArray[i];
        }
        
        CalcSeries();
    }
    
    template<typename tXArray,typename tYArray>
    CSeries(const tXArray &pXArray,const tYArray &pYArray)
    {
        int lLength=pXArray.size();
        if(lLength!=pYArray.size())
            throw XMismatch("length mismatch in CSeries");
    
        mXData.Resize(lLength);
        mYData.Resize(lLength);
        
        for(int i=0;i<lLength;i++)
        {
            mXData[i]=pXArray[i];
            mYData[i]=pYArray[i];
        }
        
        CalcSeries();
    }
    
    void CalcSeries();

    int size()      {   return mXData.size();   }
    double GetX(int i)  {   return mXData[i];           }
    double GetY(int i)  {   return mYData[i];           }

    mat::CVec_d mXData;
    mat::CVec_d mYData;

    CPoint_d mMin;
    CPoint_d mMinPos;
    CPoint_d mMax;

    std::wstring mName;
    img::CColor mColor;
};

/*namespace chart*/ } /*namespace buola*/ }

#endif
